package 反射2;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 通过反射访问私有、公有方法
 * 1.获取Class对象：
 * 2.获取Method对象：aClass.getDeclaredMethod
 * 3.调用方法：使用Method对象的invoke(Object obj, Object... args)方法来调用方法
 */
public class TestBoss {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //1.得到反射类对象
        Class<?> aClass = Class.forName("反射2.Boss");
        //2.创建类对象
        Object o = aClass.newInstance();
        //3.调用私有的say方法
        Method say = aClass.getDeclaredMethod("say", int.class, String.class, char.class);
        //4.开启访问权限
        say.setAccessible(true);
        //5.反射调用方法 invoke
        Object invoke = say.invoke(o, 100, "张三", '男');
        System.out.println("invoke = " + invoke);
        //6.调用公共的hi方法,getMethod也行，只能调用公共的方法
        Method hi = aClass.getDeclaredMethod("hi",String.class);
        Object invoke1 = hi.invoke(o, "今天学习Java反射知识");
        System.out.println("invoke1 = " + invoke1);

        Method m1 = aClass.getDeclaredMethod("m1");
        Object invoke2 = m1.invoke(o);
        System.out.println("invoke2 = " + invoke2);
        System.out.println("invoke2.getClass() = " + invoke2.getClass());
    }

}
